GtkBuilder: Add new convenience API
authorMatthias Clasen <mclasen@redhat.com>
Tue, 28 Apr 2015 02:54:25 +0000 (22:54 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 28 Apr 2015 02:54:25 +0000 (22:54 -0400)
Add a convenience function that is like gtk_builder_get_object()
but stashes away a GError if a lookup fails. To make the error
message informative, the function takes a line/column pair.

Doing things this way is necessary because the custom_tag_end,
custom_finished, and parser_finished vfuncs don't take a
GError parameter, despite being called from a place where
we can report a GError back.

gtk/gtkbuilder.c
gtk/gtkbuilderprivate.h

index 6cd801c71248362eed7306648b80038a18896139..60b3b9a6965847fcbed57dd38dd3a9f7559bc029 100644 (file)
@@ -2706,3 +2706,43 @@ _gtk_builder_check_parent (GtkBuilder           *builder,
 
   return FALSE;
 }
+
+/*< private >
+ * @builder: a #GtkBuilder
+ * @name: object name to look up
+ * @line: line number where @name was encountered
+ * @col: column number where @name was encountered
+ *
+ * Looks up an object by name. Similar to gtk_builder_get_object(),
+ * but sets an error if lookup fails during custom_tag_end,
+ * custom_finished or parser_finished vfuncs.
+ *
+ * The reason for doing things this way is that these vfuncs don't
+ * take a GError** parameter to return an error.
+ *
+ * Returns: the found object
+ */
+GObject *
+_gtk_builder_lookup_object (GtkBuilder  *builder,
+                            const gchar *name,
+                            gint         line,
+                            gint         col)
+{
+  GObject *obj;
+  GError *error = NULL;
+
+  obj = g_hash_table_lookup (builder->priv->objects, name);
+  error = (GError *) g_object_get_data (G_OBJECT (builder), "lookup-error");
+
+  if (!obj && !error)
+    {
+      g_set_error (&error,
+                   GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_ID,
+                   "%s:%d:%d Object with ID %s not found",
+                   builder->priv->filename, line, col, name);
+      g_object_set_data_full (G_OBJECT (builder), "lookup-error",
+                              error, (GDestroyNotify)g_error_free);
+    }
+
+  return obj;
+}
index d64fa10cb76cef36a2b7cc59a3be71ee4423094e..ee457c18711272461fe202c1f30b6e361c0d4e4c 100644 (file)
@@ -197,5 +197,10 @@ gboolean _gtk_builder_check_parent        (GtkBuilder           *builder,
                                            GMarkupParseContext  *context,
                                            const gchar          *parent_name,
                                            GError              **error);
+GObject * _gtk_builder_lookup_object      (GtkBuilder           *builder,
+                                           const gchar          *name,
+                                           gint                  line,
+                                           gint                  col);
+
 
 #endif /* __GTK_BUILDER_PRIVATE_H__ */